package newApi;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * flatMap返回一个流，它将提供的映射函数（即入参）应用于每个元素而生成的映射流的内容，替换this stream的每个元素的结果组成。
 * <p>
 * 什么时候用flatMap什么时候用map?
 * 当你需要把多个流【首先你要把多种情况构建成流】，扁平到一个最终的流上时候需要使用flatMap
 * flatMap入参是一个Function，你可以使用lambda返回任何一个可以被扁平化的流，返回结果是一个合并其他流结果的的新流
 */
public class StreamTest4 {
    public static void main(String[] args) {
        /**
         * 找出集合中所有单词并去重
         * 最终期望输出如下三个单词（不要求顺序）：hello welcome world
         */
        List<String> list = Arrays.asList("hello welcome", "welcome hello", "hello world hello", "hello welcome");
        // 每一个元素先转化为数组，然后使用数组初始化一个新的流，在使用flatMap扁平化多个流
        list.stream().flatMap(str -> Stream.of(str.split(" "))).distinct().forEach(System.out::println);

        // map先把字符映射为字符数组并返回一个新的流，现在流里面的元素都是字符数组了，使用flatMap，flatMap把Arrays::Stream应用到每一个字符
        // 数组上以返回一个映射流，然后把该映射流的内容组合到要返回的流上，最终flatMap返回的是一个个单词，然后去重。
        list.stream().map(str -> str.split(" ")).flatMap(Arrays::stream).distinct().forEach(System.out::println);


        /**
         * 要求输出：
         * Hi 毛毛
         * Hi 可可
         * Hi 吉吉
         * Hello 毛毛
         * ...
         */
        List<String> list1 = Arrays.asList("Hi", "Hello", "你好");
        List<String> list2 = Arrays.asList("毛毛", "可可", "吉吉");
        Stream<String> stringStream = list1.stream().flatMap(item1 -> list2.stream().map(item2 -> item1 + " " + item2));
        stringStream.forEach(System.out::println);
    }
}
